home *** CD-ROM | disk | FTP | other *** search
- /*
-
- NEW KMedia2 layout:
- ===================
-
- KMedia1 itself doesn't play anything. Instead it has a backend for every
- media type to play. It tells these backends: "start playing now", "stop
- playing now" and similar things (using libmediatool). So there is a backend
- for wave files, tacker files, midi files, etc., which all provide one
- common interface.
-
- The idea is to keep everything the old KMedia1 interface could do, but to
- move to a new IPC architecture (MCOP).
-
- That way, KMedia2 objects will be able to use the aRts streaming abilities.
- Of course, not every KMedia2 object will need these, but some of them. The
- result will be much nicer, if every of these objects can be treated in the
- standard "flow graph" way, like other aRts objects can.
-
- The ultimate media player, which KMedia2 aims to be, should play midi,
- video, audio, etc. It is about seeing a file, choosing a component which
- might be able to decode it, and play it. So it is not about starting
- the right application, but about loading the right component.
-
- This gives you the advantage that you can for instance reuse components
- even between quite different media types. It may for instance make sense
- to reuse a reverb effect to play midi, audio and video files.
-
- */
-
- #include "artsflow.idl"
-
- module Arts {
-
- enum poState {
- posIdle,
- posPlaying,
- posPaused
- };
-
- // use 2^n values here, since they can (should) be or'd together
- enum poCapabilities {
- capSeek = 1,
- capPause = 2
- };
-
- /**
- * KMedia2 time information
- *
- * This is a time value which contains either milliseconds & seconds, or
- * a custom unit or both. It is a flexible time base.
- *
- * If a value isn't there, it is set to -1.
- */
- struct poTime {
- /**
- * time it takes in seconds; -1 if no clock time known
- */
- long seconds;
-
- /**
- * additional time in milliseconds (this doesn't contain all the time)
- * -1 if no clock time known
- */
- long ms;
-
- /**
- * some custom time information
- * -1 if no custom time known
- */
- float custom;
-
- /**
- * for instance for a tracker "pattern"
- */
- string customUnit;
- };
-
- /**
- * private part of the PlayObject API (don't use)
- */
- interface PlayObject_private {
- /**
- * loads a file
- */
- boolean loadMedia(string filename);
- };
-
- /**
- * KMedia2 PlayObject - these can be used by Kaiman for instance
- */
- interface PlayObject : PlayObject_private {
- readonly attribute string description;
- readonly attribute poTime currentTime;
- readonly attribute poTime overallTime;
- readonly attribute poCapabilities capabilities;
- readonly attribute string mediaName;
- readonly attribute poState state;
-
- /**
- * starts playing the media
- */
- void play();
- /**
- * seeks to a specific time
- */
- void seek(poTime newTime); // could be handled by setting currentTime
- /**
- * pauses playing the media
- */
- void pause();
- /**
- * stop playing the media. Normally this function would called stop,
- * but the name is reserved for the start/stop mechanism of the
- * aRts objects.
- */
- void halt();
- };
-
- /**
- * use this to create new PlayObjects for media
- */
- interface PlayObjectFactory {
- /**
- * creates a play object (or returns a null reference if this is not
- * possible)
- *
- * @param filename the name of the file to create a play object for
- */
- PlayObject createPlayObject(string filename);
- };
-
- /**
- * UNSTABLE/EXPERIMENTAL!
- */
- interface InputStream : SynthModule {
- /**
- * whether the stream is at the end of the input
- */
- readonly attribute boolean eof;
-
- /**
- * total size of the stream in bytes
- * -1: unknown
- */
- readonly attribute long size;
-
- /**
- * whether the stream can be seeked
- */
- readonly attribute boolean seekOk;
-
- /**
- * this returns the new AGE of the stream, where AGE is defined as the
- * number of bytes that have been sent since the stream exists
- */
- long seek(long position);
-
- /**
- * the stream data
- */
- async out byte stream outdata;
- };
-
- /**
- * UNSTABLE/EXPERIMENTAL! Example stream for files.
- */
- interface FileInputStream : InputStream {
- attribute string filename;
-
- boolean open(string filename);
- };
-
- interface StdoutWriter : SynthModule {
- async in byte stream indata;
- };
-
- interface StreamPlayObject : PlayObject {
- /**
- * prepares the playobject for the stream
- */
- boolean streamMedia(InputStream instream);
-
- /**
- * last used inputstream
- * it should never change
- */
- InputStream inputStream();
- };
-
- /**
- * Playobject with adjustable speed
- */
- interface PitchablePlayObject {
- /**
- * speed relative to "original"/intended one
- * (1.0=normal, 2.0=double ;-), 1.05=5% faster)
- */
- attribute float speed;
- };
-
- /**
- * KMedia2 VideoPlayObject - new interface for video support
- *
- * Some of the communication is done using the X11 protocol.
- */
- interface VideoPlayObject {
- /**
- * video output window (active)
- */
- attribute long x11WindowId;
- /**
- * take a snapshot and draw it onto a pixmap
- * returns the X11 pixmap ID or -1 on error
- */
- long x11Snapshot();
- };
-
- /**
- * Extended Version of PlayObjectFactory
- */
- interface PlayObjectFactoryV2 : PlayObjectFactory {
- /**
- * creates a PlayObject
- *
- * @param url the url to create a play object for
- * @param mimetype mimetype for the url
- * @param createBUS specifies wheter to create the bus-uplink or not
- */
- PlayObject createPlayObjectForURL(string url, string mimetype, boolean createBUS);
-
- /**
- * creates a StreamPlayObject (used internally!)
- *
- * @param instream specifies the InputStream
- * @param mimetype mimetype for the InputStream
- * @param createBUS specifies wheter to create the bus-uplink or not
- */
- PlayObject createPlayObjectForStream(InputStream instream, string mimetype, boolean createBUS);
- };
-
- };
-